在前面幾天,我們實際操作了使用 GORM 來與 SQL 資料庫進行互動,也使用 Gin 來開發 Web Backend API,並相互整合在一起
今天要來進行跟這次參賽主題 Cloud Native 有關的事,也就是要來進行包 Docker Image,讓我們的服務可以跑在 Container 上
下面我們就來實際操作吧
要進行 Docker Image 前,首先我們要先確定電腦上已經有安裝好 docker 環境了
這邊我們可以到 Docker 官網 來下載 Docker Desktop
選擇自己電腦版本下載及安裝即可!
安裝好 Docker Desktop 後,我們的 docker 環境就安裝好啦~
接下來就要來撰寫打包 Docker Image 的重要檔案 - Dockerfile (注意,沒有副檔名喔!)
這邊我們要打包出來的 Docker Image 會是屬於多架構的,下面就來說明為什麼要打包成多架構的 Docker Image 啦
Docker Image 預設的系統架構會是跟 執行打包作業的電腦 相同
也就是說
如果你用 x86_64 架構的電腦進行打包,打包出來的 Docker Image 就會是 x86_64 架構的 (俗稱:amd64)
反之,如果你用 ARM 架構的電腦進行打包 (Ex:Apple M2 Ultra),打包出來的 Docker Image 就會是 ARM 架構的 (俗稱:arm64),兩個架構之間是不互通的
所以說,如果想讓你的應用,可以同時執行在不同架構上的話,那麼就需要進行多架構打包啦~
說明完什麼是多架構後,就要來撰寫 Dockerfile 啦~
再次說明,Dockerfile 是沒有副檔名的!
FROM golang:latest
RUN mkdir -p /it15th
WORKDIR /it15th
COPY . .
ARG TARGETARCH
RUN go mod download && CGO_ENABLED=1 GOOS=linux GOARCH=${TARGETARCH} go build -o it15th
EXPOSE 8080
CMD [ "./it15th" ]
# 透過 golang:latest 這個由 Go 官方推出的 Docker Image
# 來當作我們這個 Image 的 Base Image
FROM golang:latest
# 建立資料夾
# -p 代表如果該資料夾尚不存在的話,則自動建立該資料夾
RUN mkdir -p /it15th
# 設定工作目錄
WORKDIR /it15th
# 將所有檔案複製到 Image 的資料夾內 (.)
# 這邊有設定 WORKDIR (工作目錄),所以就是會複製到工作目錄底下
# 否則預設是複製到根目錄底下
COPY . .
# 因為我們最終是要打包成多架構的 Docker Image
# 所以這邊我們需要設定一個 TARGETARCH 的參數
# 在執行打包的時候傳入
ARG TARGETARCH
# Build
# 先將 go.mod 內用到的套件下載下來
# 接著編譯對應系統架構 (linux/amd64、linux/arm64) /it15th 底下的 go 檔案
RUN go mod download && CGO_ENABLED=1 GOOS=linux GOARCH=${TARGETARCH} go build -o it15th
#「宣告」要對外開放的 port 號
EXPOSE 8080
# 執行 docker run 時,會執行的指令
CMD [ "./it15th" ]
這邊我們就直接在 Terminal 下 docker build
就可以開始打包了
docker build --no-cache -t {DOCKER_HUB_USERNAME}/{IMAGE_NAME}:{IMAGE TAG} . --platform linux/amd64,linux/arm64
在先前,如果下 docker build
,是只能編譯單一架構的 Image
如果要多架構的話,需要先個別打包,再透過 docker manifest 進行合併
後來 Docker 約 2019 年的時候推出了 docker buildx 來解決這個問題
但一開始預設是沒有開啟的,畢竟是實驗性功能
而現在在較新版的 Docker Desktop 與 Docker Engine 則預設在執行 docker build
時,會預設調用 Buildx 來進行編譯,不用像先前需要使用 docker buildx build
來進行調用
docker push {DOCKER_USERNAME}/{IMAGE_NAME}:{IMAGE_TAG}
推上 Docker Hub 後,就可以使用 Docker 來執行了
今天我們成功將服務包成 Docker Image,並推上 Docker Hub 上了
明天我們要來將今天上述的一連串操作進行自動化,也就是結合 CI/CD,我們會使用 GitLab CI 來完成
那麼我們就明天見啦~
- Docker Build architecture (https://docs.docker.com/build/architecture/)
- Multi-platform images (https://docs.docker.com/build/building/multi-platform/)
- Docker Buildx GitHub (https://github.com/docker/buildx)